//deepClone({id:1,name:"34期"}，hash)

function deepClone(obj, hash = new Map()) {
    if (obj === null) return obj; // 如果是null或者undefined我就不进行拷贝操作
    if (obj instanceof Date) return new Date(obj);
    if (obj instanceof RegExp) return new RegExp(obj);
    // 可能是对象或者普通的值  如果是函数的话是不需要深拷贝
    if (typeof obj !== "object") return obj;
    // 是对象的话就要进行深拷贝
    if (hash.get(obj)) return hash.get(obj);
    // 首先创建一个空对象，这个空对象和传递进来对象类型一样
    // if(obj instanceof Object){
    //     cloneObj = {}
    // }
    // if(obj instanceof Array){
    //     cloneObj = []
    // }
    let cloneObj = new obj.constructor();
    // 找到的是所属类原型上的constructor,而原型上的 constructor指向的是当前类本身
    hash.set(obj, cloneObj);
    for (let key in obj) {
        //只克隆obj对象自身的是属性。obj原型上面还有属性
        if (obj.hasOwnProperty(key)) {
            // 实现一个递归拷贝
            // 第一次循环：key=id value=1  cloneObj={id:1},
            // 第二次循环：key=classes value={}  cloneObj={id:1,classes:{}},

            //第一次循环：key=id value=1  const res=1 = deepClone(1,hash)
            //第一次循环：key=classes value={id:,name} {id:1.name:"34期"} deepClone({id:1,name:"34期"}，hash)
            cloneObj[key] = deepClone(obj[key],hash)
        }
    }
    return cloneObj;
}

let obj = {
    id:1,
    classes:{
        id:1,
        name:"34期"
    },
    teacher:["1","2"]
}

const newObj = deepClone(obj)
console.log(newObj == obj);
console.log(newObj.classes == obj.classes); 
console.log(newObj.teacher == obj.teacher);
